package com.learn.tx.xml;

import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;
import java.sql.Types;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 《Spring源码深度解析》第10章 事务
 *  数据操作接口实现类
 */
public class UserServiceImpl implements UserService {

    private JdbcTemplate jdbcTemplate;

    // 设置数据源
    public void setDataSource(DataSource dataSource){
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public void save(User user) throws Exception {
    	String sql = "insert into user(name, age, sex) value(?, ?, ?)";
        jdbcTemplate.update(sql,
                new Object[]{ user.getName(), user.getAge(), user.getSex()},
                new int[]{Types.VARCHAR, Types.INTEGER, Types.VARCHAR});

        // 事务测试，加上这句代码则数据不会保存到数据库中
        // 注意：默认情况下 Spring 中的事务处理只对 RuntimeException 方法进行回滚，
        // 所以如果此处理将 RuntimeException 替换成普通的 Exception 不会产生回滚效果。
        throw new RuntimeException("UserServiceImpl 事务异常！");
    }

	@Override
	public void deleteById(Integer id) {
		String sql = "delete from user where id = ?";
		jdbcTemplate.update(sql, id);
		System.out.println("Delete record, id = " + id);
		// 事务测试，抛出异常，让上面的插入操作回滚
		throw new RuntimeException("aa");
	}

	@Override
	public List<User> selectAll() {
		String sql = "select * from user";
		List<Object> users = jdbcTemplate.query(sql, new UserRowMapper());
		List<User> list = users.stream().map(user -> (User) user).collect(Collectors.toList());
		return list;
	}
}
